/*--------------------------------------------------------------------------
 *
 * fdb_crypt.h
 *		加解密公共函数
 *
 *
 * -------------------------------------------------------------------------
 */

#ifndef _FDB_CRYPTO_H_
#define _FDB_CRYPTO_H_

typedef enum _FDB_ENCRYPT_TYPE{
	FDB_ENCRYPT_TYPE_NONE = 0,
	FDB_ENCRYPT_TYPE_XOR,
	FDB_ENCRYPT_TYPE_RC4,
	FDB_ENCRYPT_TYPE_SM4
}FDB_ENCRYPT_TYPE;

 
#define FDB_CRYPT_PER_LEN 256
#define FDB_TDE_PASSWD_MINLEN 6 /* TDE 外部key 最小长度 */
#define FDB_EXTKEY_LEN 32  /* TDE 外部key经过摘要算法后的最大长度 */
#define FDB_DSKKEY_LEN 32  /* TDE 用于对对象密钥加密的DSK长度 */
#define FDB_OBJKEY_LEN 32  /* TDE 对象密钥加密的obj_key长度 */


#define FDB_SYS_IDENTIFIER_LEN 20  /* atabase system identifier 转为字符串后的最大长度，不含 ‘\0’ */


#ifdef FDDGM
/* 国密sm4 XTS 算法*/
#define FDB_SM4_XTS_KEY_LEN 32 /* 国密SM4 XTS 算法的 密钥值长度 */
#define FDB_SM4_XTS_IV_LEN  16 /* 国密SM4 XTS 算法的 tweak值长度 */
#endif


struct fdb_cipher_state {
	FDB_ENCRYPT_TYPE type;

    unsigned char  perm[FDB_CRYPT_PER_LEN];
    unsigned char  pkey[FDB_CRYPT_PER_LEN];
#ifdef FDDGM
	unsigned char  iv[FDB_SM4_XTS_IV_LEN];/* 国密SM4-XTS算法的tweak值,sm4-xts算法采用blocknum、lsn作为tweak值，故不用初始化该字段*/
#endif

    unsigned char  index1;
    unsigned char  index2;
};
/* 加密类型转字符串函数 */
extern const char* fdb_encrypttype_tochar(FDB_ENCRYPT_TYPE type);


extern void fdb_cipher_init(struct fdb_cipher_state *const state, FDB_ENCRYPT_TYPE type, const unsigned char *key, int keylen, const unsigned char *iv);
extern void fdb_cipher_reset(struct fdb_cipher_state *const state);

/* 加密函数 */
extern void fdb_encrypt(struct fdb_cipher_state *const state, const unsigned char *inbuf, unsigned char *outbuf, int buflen);
/* 解密函数 */
extern void fdb_decrypt(struct fdb_cipher_state *const state, const unsigned char *inbuf, unsigned char *outbuf, int buflen);

#endif
